export const getInputs = () => [[]];

/**
 * **[155. 最小栈](https://leetcode.cn/problems/min-stack/)**
 *
 * 设计一个支持 `push` ，`pop` ，`top` 操作，并能在常数时间内检索到最小元素的栈。
 *
 * 实现 `MinStack` 类:
 *
 * - `MinStack()` 初始化堆栈对象。
 * - `void push(int val)` 将元素val推入堆栈。
 * - `void pop()` 删除堆栈顶部的元素。
 * - `int top()` 获取堆栈顶部的元素。
 * - `int getMin()` 获取堆栈中的最小元素。
 *
 */
class MinStack {
	private stack: number[] = [];
	private minStack: number[] = [];

	constructor() {}

	push(val: number): void {
		this.stack.push(val);
		if (!this.minStack.length) {
			this.minStack.push(val);
			return;
		}

		let min: number = this.minStack.pop()!;
		const popArr: number[] = [];
		while (this.minStack.length) {
			if (min < val) {
				this.minStack.push(min);
				break;
			}

			popArr.unshift(min);
			min = this.minStack.pop()!;
		}

		console.log(this.minStack, val, popArr);
		this.minStack = this.minStack.concat(val, ...popArr);
	}

	pop(): void {
		const value = this.stack.pop();
		const popArr: number[] = [];
		for (const num of this.minStack) {
			if (num === value) {
				this.minStack.pop();
				break;
			}
			popArr.push(this.minStack.pop()!);
		}
		this.minStack = this.minStack.concat(popArr);
	}

	top(): number {
		return this.stack.at(-1)!;
	}

	getMin(): number {
		return this.minStack.at(-1)!;
	}
}

export default () => {
	const ms = new MinStack();
	ms.push(-2);
	ms.push(0);
	ms.push(-3);
	return ms;
};
